// controller层
import { controller, httpGet as GetMapping, httpPost as PostMapping } from 'inversify-express-utils'

import { UserService } from './services'
import { inject } from 'inversify'

import type { Request, Response } from 'express'

import { JWT } from '../jwt'

// 以类创建， 装饰器中可以写访问路由
@controller('/user')              // 需要开启tsconfig.json中对装饰器的支持
export class UserController {
    // 在构造方法中注入service
    constructor(
        @inject(UserService) private readonly userService: UserService   // 依赖注入
    ) {

    }

    // @GetMapping('/index')
    @GetMapping('/index', JWT.middleware())                    // 假设这个接口需要token才能获取数据，GetMapping方法的第二个参数可以传中间件
    public async getIndex(req: Request, res: Response) {
        // console.log(req.query);
        // console.log(req.params);
        // 因为token里是携带用户信息的，这里就可以直接获取
        console.log(req.user);
        // console.log(req.user.id);  // 直接读id会报错，所以要扩展Express下的User接口的声明
        /*
            像这样，不过要写一个声明文件最好，然后在main.ts中引一下
            declare global {
                namespace Express{
                    interface User {     // 这里预留好了，里面是可以扩充的
                        id: number,
                        name: string,
                        email:string
                    }
                }
            }
        */
        let result = await this.userService.getList()
        res.send(result)
    }

    @PostMapping('/create')
    public async createUser(req: Request, res: Response) {
        // console.log(req.body);
        let result = await this.userService.insertUser(req.body)
        res.send(result)
    }
}